package cn.wizzer.app.web.modules.controllers.platform.sys;

import cn.wizzer.app.sys.modules.models.SysCurrency;
import cn.wizzer.app.sys.modules.models.SysPayWay;
import cn.wizzer.app.sys.modules.services.SysCurrencyService;
import cn.wizzer.app.sys.modules.services.SysPayWayService;
import cn.wizzer.app.user.modules.models.enums.PayChannel;
import cn.wizzer.app.web.commons.ulog.annotation.SLog;
import cn.wizzer.app.web.commons.utils.StringUtil;
import cn.wizzer.framework.util.Result;
import com.alibaba.dubbo.config.annotation.Reference;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.EnumUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 后台支付方式管理
 */
@IocBean
@At("/platform/sys/payWay")
public class SysPayWayController {
    @Inject
    @Reference
    private SysPayWayService payWayService;

    @Inject
    @Reference
    private SysCurrencyService currencyService;

    @At("/")
    @Ok("beetl:/platform/sys/payWay/index.html")
    @RequiresPermissions("sys.finance.payWay.list")
    public void index() {
    }


    /**
     * 支付方式枚举名称列表
     *
     * @param currencyId
     * @return
     */
    @At
    @Ok("json")
    public Object enums(@Param("currencyId") String currencyId) {
        SysCurrency currency = currencyService.fetch(currencyId);
        List<PayChannel> enums = Lists.newArrayList();
        // 如果币种为数字货币，只返回ERC20
        if (currency.getDigital()) {
            enums.add(PayChannel.ERC20);
        }
        // 不是数字货币则返回其他的支付方式
        else {
            enums = EnumUtils.getEnumList(PayChannel.class)
                    .stream()
                    .filter(payWay -> !payWay.equals(PayChannel.ERC20))
                    .collect(Collectors.toList());
        }
        return Result.success().addData(enums);
    }


    /**
     * 根据币种id获取支付方式
     *
     * @param currencyId
     * @return
     */
    @At
    @Ok("json")
    public Object list(@Param("currencyId") String currencyId) {
        Cnd cnd = Cnd.NEW();
        if (Strings.isNotBlank(currencyId)) {
            cnd.and("currencyId", "=", currencyId);
        }
        return Result.success().addData(payWayService.query(cnd));
    }


    /**
     * 支付方式列表
     *
     * @param pageNumber
     * @param pageSize
     * @param searchKeyword
     * @return
     */
    @At
    @Ok("json:full")
    @RequiresPermissions("sys.finance.payWay.list")
    public Object data(@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize, String searchKeyword) {
        return Result.success(payWayService.listPage(pageNumber, pageSize, searchKeyword));
    }

    /**
     * 查询单条
     *
     * @param id
     * @return
     */
    @At("/edit/?")
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.list")
    public Object edit(String id) {
        return Result.success().addData(payWayService.fetch(id));
    }


    /**
     * 修改支付方式
     *
     * @param payWay
     * @return
     */
    @At
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.edit")
    @SLog(tag = "修改支付方式", msg = "支付方式id：${args[0].id}")
    public Object editDo(@Param("..") SysPayWay payWay) {
        payWay.setOpBy(StringUtil.getPlatformUid());
        payWay.setOpAt(1L);
        payWayService.update(payWay);
        return Result.success();
    }


    /**
     * 添加支付方式
     *
     * @param payWay
     * @return
     */
    @At
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.add")
    @SLog(tag = "添加支付方式", msg = "支付方式名称${args[0].playWay}")
    public Object add(@Param("..") SysPayWay payWay) {
        payWay.setOpBy(StringUtil.getPlatformUid());
        payWay.setOpAt(1L);
        payWayService.insert(payWay);
        return Result.success();
    }

    /**
     * 删除支付方式
     *
     * @param id
     * @return
     */
    @At("/delete/?")
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.delete")
    @SLog(tag = "删除支付方式", msg = "支付方式id：${args[0].id}")
    public Object delete(String id) {
        payWayService.delete(id);
        return Result.success();
    }


    /**
     * 启用支付方式
     *
     * @param id
     * @return
     */
    @At("/enable/?")
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.edit")
    @SLog(tag = "启用支付方式", msg = "支付方式名:${args[1].getAttribute('playWay')}")
    public Object enable(String id) {
        payWayService.update(Chain.make("disabled", false), Cnd.where("id", "=", id));
        return Result.success();
    }

    /**
     * 禁用支付方式
     *
     * @param id
     * @return
     */
    @At("/disable/?")
    @Ok("json")
    @RequiresPermissions("sys.finance.payWay.edit")
    @SLog(tag = "禁用支付方式", msg = "支付方式名:${args[1].getAttribute('playWay')}")
    public Object disable(String id) {
        payWayService.update(Chain.make("disabled", true), Cnd.where("id", "=", id));
        return Result.success();
    }
}
